package com.cskaoyan.javase.array._5variable;

/**
 * 可变参数（variable parameter）
 * 是Java1.5时增加的新特性，当然我们已经在用Java8了，它一点也不新了。
 *
 * 可变参数的用途不算非常多，但也是常见语法。
 * 可变参数适用于：参数个数不确定，类型确定的情况.
 *
 * 可变参数的语法:
 * [修饰符列表] 返回值类型 方法名 (形式参数列表,数据类型... 变量名){
 *   //方法体
 * }
 * 以上方法形参列表中的"数据类型... 变量名"就是可变参数
 * 数据类型是不确定个数参数的数据类型
 *
 * 可变参数的实质是一个对应数据类型数组的形参
 * 在方法体就可以把可变参数,当成一个数组进行处理
 *
 * 一个具有可变参数的方法,允许调用方法时,传入不确定个数的对应实参,这是普通的形参所不具备的
 *
 * 可变参数的实现原理并不高大上
 * 它的本质仍然是一个数组
 * 只不过原先数组形参的方法,要求在调用方法时,程序员手动创建数组
 * 现在可变参数的数组,不需要程序员手动创建了,而是由底层(编译器)创建
 *
 * 这种程序员少做事情,底层来做更多的事情,同时实现的原理不变,这被称之为"语法糖"
 *
 *
 * @since 09:51
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        // 可变参数的本质是数组,所以传入数组也很正常,但是一般不建议这么做,因为没有必要
        System.out.println(sum(arr));

        System.out.println(sum(1, 1));
        System.out.println(sum(1, 1, 2));
        System.out.println(sum(1, 1, 2, 4));
        System.out.println(sum(1, 1, 2, 4, 5));

    }

    /*
        需求: 求不确定个数的int类型数值的和
        给方法传入传入一个容器,然后在方法体中将容器中的元素全部加起来
     */
    /*public static int sum(int[] arr) {
        // 遍历数组求和
        int result = 0;
        for (int ele : arr) {
            result += ele;
        }
        return result;
    }*/

    /*
        以上sum方法求解,需要传入一个int数组
        虽然能够实现功能,但是如果我有以下需求:
        希望能够在调用方法时,直接在实参类别中写不确定个数的参数,而不是预先定义数组
        这种需求就需要使用可变参数了.
     */
    // 'sum(int...)' is already defined in 'com.cskaoyan.javase.array._5variable.detail'
    public static int sum(int... vp) {
        // 遍历数组求和
        int result = 0;
        for (int ele : vp) {
            result += ele;
        }
        return result;
    }
}
